home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok82.lha / Printf1.4 / Printf.dok next >
Text File  |  1993-08-15  |  5KB  |  134 lines

  1. :Program.    Printf
  2. :Author.     Volker Rudolph, hartmut Goebel [hG]
  3. :Address.    Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern
  4. :Phone.      06301/8566
  5. :Date.       22 Aug 1992 21:04:06
  6. :Copyright.  PD
  7. :Language.   Assembler / Oberon
  8. :Translator. A68k / Amiga-Oberon V2.45
  9. :History.    V1.3 14 Nov 1991 [hG] LONGINT -> s.ADDRESS
  10. :History.    V1.4 27 Aug 1992 [hG] angepasst an AO 3.0
  11. :Contents.   Allzweck-Textausgabe in Form der C-Funktion Printf
  12. :Usage.      Aufruf und Parameter wie in C
  13.  
  14. Oberon ist eine sehr gute Programmiersprache, sie hat aber auch einige
  15. Schwächen. Am meisten hat mich die aufwendige Textausgabe gestört.
  16. Allein ein einfacher Satz, wie 'Der Buchstabe A hat den ASCII-Code
  17. 65.', erfordert 6 Funktionsaufrufe.
  18.  
  19. char := 'A';
  20. io.WriteString('Der Buchstabe ');
  21. io.Write(char);
  22. io.WriteString(' hat den ASCII-Code ');
  23. io.WriteInt(ORD(char),2);
  24. io.Write('.');
  25. io.WriteLn;
  26.  
  27. In der Programmiersprache C ist das viel einfacher:
  28. printf("Der Buchstabe %c hat den ASCII-Code %d.\n",char,char);
  29.  
  30. Deshalb habe ich das Modul Printf programmiert. Da es möglichst kurz
  31. sein sollte, ist es komplett in Assembler geschrieben. Es enthält
  32. Prozeduren, die den gleichen Aufruf und die gleiche Funktion haben,
  33. wie das printf von C. Allerdings ist es in Oberon nicht wie in C
  34. möglich, eine Funktion mit variabler Anzahl von Parametern zu
  35. definieren. Deshalb gibt es 7 Funktionen: Printf0 bis Printf6. Die
  36. Zahl hinter dem Printf entspricht der Anzahl der Parameter, die die
  37. Funktion erwartet. Die Parameter sind alle von Typ LONGINT, da man die
  38. meisten Variablen-Typen in LONGINT umwandeln kann.
  39.  
  40. Der Funktionsaufruf von Printf2 würde lauten:
  41.  
  42. Printf2("Der Buchstabe %lc hat den ASCII-Code %ld.\n", ORD(char),
  43. ORD(char));
  44.  
  45. Die Format-Elemente (%s %ld etc.) haben das Format:
  46.  
  47. %[flags][breite.limit]typ
  48.  
  49. flags   : Es gibt nur das Flag '-'. Es bedeutet, daß das Argument in
  50.           seinem Feld nach links ausgerichtet wird.
  51. breite  : Minimale Feldbreite. Das Feld wird normalerweise mit Blanks
  52.           aufgefüllt. Beginnt die Feldbreite mit einer 0, so wird mit
  53.           '0' aufgefüllt.
  54. limit   : Maximale Anzahl von Zeichen, die bei einem String ausgegeben
  55.           werden.
  56. typ     : ld : Dezimal
  57.           lx : Hexadezimal
  58.           lc : Zeichen
  59.            s : String
  60.  
  61.  
  62. Printf importiert kein weiteres Modul. Als Default werden die Texte
  63. zur Standardausgabe (Dos.Ouput()) geschrieben. Falls man eine andere
  64. Ausgabe bevorzugt, kann man aber der Prozedur-Variablen 'writeProc'
  65. eine beliebige Prozedur vom Typ 'WriteProcType' zuweisen. Das ist zu
  66. empfehlen, wenn das Programm auch von der Workbench aus gestartet
  67. werden kann. Man sollte dann writeProc die Prozedur io.WriteString
  68. zuweisen, da ohne io kein Ausgabefenster geöffnet wird. Der gesamte
  69. Ausgabestring sollte nicht länger als 'bufSize' (120) Zeichen sein.
  70. überzählige Zeichen werden abgeschnitten.
  71.  
  72. Einige Beispiele:
  73.  
  74.   p.Printf0("\[0;33;40m RED \[0;31;40m WHITE\n");
  75.   RED wird in rot und WHITE in weiß ausgegeben (bei normaler Farbeinstellung)
  76.  
  77.   Die oben benutzte Kontroll-Sequenz hat das Format: "\[<style>;<fg>;<bg>m"
  78.   Dabei lassen sich folgende Werte angeben:
  79.  
  80.     <style> =    0  plain text
  81.                  1  bold-face
  82.                  3  italic
  83.                  4  underscore
  84.                  7  inverse-video
  85.  
  86.     <fg>    =    30 - 37     Vordergrundfarbe 0 bis 7 (Standard : 0 bis 3)
  87.  
  88.     <bg>    =    40 - 47     Hintergrundfarbe 0 bis 7 (Standard : 0 bis 3)
  89.  
  90.   Man kann alle Kontroll-Sequenzen des Console.device benutzen.
  91.   Siehe "Rom Kernel Reference Manual:Libraries and Devices"
  92.  
  93.   string := "Teststring";
  94.   p.Printf2("Der String %6.8s ist %ld Zeichen lang.\n",
  95.             sys.ADR(string),str.Length(string));
  96.   >>Der String TestStri ist 10 Zeichen lang.
  97.                12345678
  98.  
  99.   string := "Test";
  100.   p.Printf2("Der String %6.8s ist %ld Zeichen lang.\n",
  101.             sys.ADR(string),str.Length(string));
  102.   >>Der String   Test ist 4 Zeichen lang.
  103.                123456
  104.  
  105.   p.Printf2("Dezimal %3ld = Hex %04lx.\n",123H,123H);
  106.   >>Dezimal 291 = Hex 0123.
  107.  
  108. Falls man einen String nicht direkt ausgeben will, sondern z.B. als
  109. Parameter für einen Prozedur-Aufruf braucht, kann man anstelle von
  110. Printfx die Prozeduren SPrintfx benutzen. Sie geben die Strings nicht
  111. aus, sondern schreiben sie in einen Puffer, der mit übergeben wird.
  112. Das ist auch praktisch, wenn der Ausgabestring länger als 120 Zeichen
  113. ist.
  114.  
  115. Beispiel:
  116.              .
  117.              .
  118.              .
  119. IMPORT d:Dos,sys:SYSTEM,p:Printf;
  120.  
  121. VAR
  122.   name:ARRAY 20 OF CHAR;
  123.   buffer:ARRAY 80 OF CHAR;
  124.   handle:d.FileHandlePtr;
  125. BEGIN
  126.   name := "Printf";
  127.   p.SPrintf1(buffer,"DH0:Oberon/TXT/%s.mod",sys.ADR(name));
  128.   handle := d.Open(buffer,d.newFile);
  129.              .
  130.              .
  131.              .
  132.  
  133.   Das Programmstück öffnet die Datei "DH0:Oberon/TXT/Printf.mod"
  134.